package ro.src;

public class Image {
	
	public int[][] pixel;
	public int label;
	private int xSize, ySize;
	
	public Image(int size) {
		pixel = new int[28][28];
	}
	
	//cechy
	public Features extractFeatures(){
		Features f= new Features();
		f.ratio = extractRatio();
		f.diagonal = extractDiagonal(0);
		f.cross = extractCross();
		float q2 = extractQuarter(2);
		if(q2==0) q2=0.00001f;
		float q3 = extractQuarter(3);
		if(q3==0) q3=0.00001f;
		f.quarter1 = extractQuarter(1)/q2;
		f.quarter2 = extractQuarter(0)/q3;
		f.quarter3 = extractQuarter(2)/q3;
		f.label = label;
		return f;
		
	}
	
	//krzyz
	public float extractCross() {
		float sr1=0, sr2=0;
		//poziomo
		for(int i=12; i < 16; i++){
			for(int j=0; j < pixel.length-1; j++) {
				sr1+=pixel[i][j];
			}
		}
		//pionowo
		for(int i=12; i < 16; i++){
			for(int j=0; j < pixel.length-1; j++) {
				sr2+=pixel[j][i];
			}
		}
		return sr1/sr2;
	}

	// szerokosc / wysokosc
	public float extractRatio(){
		int xmin=28, xmax=0, ymin=28, ymax=0;
		for(int i=0; i<pixel.length; i++){
			for(int j=0; j<pixel.length; j++){
				if(pixel[i][j]!=0){
					if(xmin>j) xmin=j;
					if(xmax<j) xmax=j;
					if(ymin>i) ymin=i;
					if(ymax<i) ymax=i;
				}
			}
		}
		xSize=xmax-xmin+1;
		ySize=ymax-ymin+1;
		return (float)xSize/(float)ySize;
	}
		
	//stosunek wartosci pixeli po przekatnej
	public float extractDiagonal(int k){
		float resultB=0, resultU=0;
		//R
		for(int i=0; i<pixel.length; i++){
			for(int j=pixel.length-1; j>=(pixel.length-1)-i; j--){
				resultB+=pixel[i][j];
			}
		}
		//L
		for(int i=0; i<pixel.length; i++){
			for(int j=0; j<=i; j++){
				resultU+=pixel[i][j];
			}
		}
		if(k==0) return resultB/resultU;
		if(k==1) return resultB;
		else return resultU;
	}
	
	//cwiartki
	public float extractQuarter(int q){
		float result=0;
		if(q==0){
			//TL
			for(int i=0; i<14; i++){
				for(int j=0; j<14; j++){
					result+=pixel[i][j];
				}
			}
		}
		else if(q==1){
			//TR
			for(int i=0; i<14; i++){
				for(int j=14; j<28; j++){
					result+=pixel[i][j];
				}
			}			
		}
		else if(q==2){
			//BL
			for(int i=14; i<28; i++){
				for(int j=0; j<14; j++){
					result+=pixel[i][j];
				}
			}			
		}
		else {
			//BR
			for(int i=14; i<28; i++){
				for(int j=14; j<28; j++){
					result+=pixel[i][j];
				}
			}			
		}
		return result;
	}
	
}
